package com.titanrise.crm.environment.ioc;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;

/**
 * @Description: 类扫描器 用于扫描项目中的类并加载
 * @Author: pront
 * @Time:2024-11-02 12:10
 */

public class ClassScanner {

    public static Set<Class<?>> getClasses(String packageName) throws IOException, ClassNotFoundException {
        Set<Class<?>> classes = new HashSet<>();
        String path = packageName.replace('.', '/');

        // 获取包的路径URL，使用系统类加载器
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        URL resource = classLoader.getResource(path);
        if (resource == null) {
            throw new IOException("包路径不存在: " + packageName);
        }

        // 查找该路径下的所有类
        File directory = new File(resource.getFile());
        if (directory.exists()) {
            // 扫描目录下所有.class文件
            findClasses(directory, packageName, classes);
        }

        return classes;
    }

    // 递归扫描文件夹，查找所有的类文件
    private static void findClasses(File directory, String packageName, Set<Class<?>> classes)
            throws ClassNotFoundException {
        File[] files = directory.listFiles();
        if (files == null) return;

        for (File file : files) {
            if (file.isDirectory()) {
                // 如果是文件夹，则递归扫描子文件夹
                findClasses(file, packageName + "." + file.getName(), classes);
            } else if (file.getName().endsWith(".class")) {
                // 去掉文件名中的“.class”并加载类
                String className = packageName + '.' + file.getName().substring(0, file.getName().length() - 6);
                Class<?> clazz = Class.forName(className);
                classes.add(clazz);
            }
        }
    }
}
